package org.dicr.sys.linux;

import java.io.*;
import java.util.*;
import java.util.regex.*;

import org.dicr.util.data.*;

/**
 * System users group
 * 
 * @author Igor A Tarasov &lt;java@dicr.org&gt;
 * @version 1.0
 */
public class SysGroup implements Serializable {

	private static final long serialVersionUID = 6878967876088413857L;

	/** Maximum name length */
	public static final int NAME_MAXLENGTH = 15;

	/** Name pattern */
	public static final Pattern NAME_PATTERN = Pattern.compile(String.format("^[a-z0-9\\_]{1,%d}$",
			Integer.valueOf(NAME_MAXLENGTH)));

	/** Group name */
	protected String name = null;

	/** SysGroup ID */
	protected int gid = 0;

	/** Extra members */
	protected Collection<String> extraMembers = new ArrayList<>();

	/**
	 * Constructor.
	 * 
	 * @param grpName
	 *            имя группы
	 * @param theGid
	 *            SysGroup ID (>=0).
	 * @param theExtraMembers
	 *            дополнительные члены (пользователи) группы.
	 */
	protected SysGroup(String grpName, int theGid, Collection<String> theExtraMembers) {
		String theName = StringUtils.normalize(grpName);
		if (theName == null) throw new IllegalArgumentException("empty name");
		if (!NAME_PATTERN.matcher(theName).matches()) throw new IllegalArgumentException("name: " + theName);
		this.name = theName;
		if (theGid < 0) throw new IllegalArgumentException("gid: " + theGid);
		this.gid = theGid;
		if (theExtraMembers != null) this.extraMembers = theExtraMembers;
	}

	/**
	 * Возвращает имя группы.
	 * 
	 * @return имя группы.
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * Возвращает SysGroup ID.
	 * 
	 * @return GID
	 */
	public int getGid() {
		return this.gid;
	}

	/**
	 * Возвращает дополнительных членов группы.
	 * 
	 * @return члены группы.
	 */
	public Collection<String> getExtraMembers() {
		return this.extraMembers;
	}

	/**
	 * Возвращает строковое представление.
	 * 
	 * @return строковое представление.
	 */
	@Override
	public String toString() {
		return "SysGroup[" + this.name + "]";
	}
}
